package es;

public class CromossomoReal {

	private double desvio;

	private double[] valores;

	private double delta = 0.001;

	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}

	public void mutacao() {
		double sorteio, valor_elem;
		int i;
		for (i = 0; i < valores.length; i++) {
			sorteio = Math.random();
			valor_elem = calcula_elemento(sorteio);
			valores[i] = valor_elem;
		}
	}

	private double calcula_elemento(double prob) {
		double retorno = -5;
		double somatorio = 0;
		while (somatorio < prob) {
			retorno += delta;
			somatorio += integral(retorno, retorno - delta);
		}
		return retorno;
	}

	private double integral(double lim_sup, double lim_inf) {
		double retorno = 0;
		double aux_soma, aux = normal(lim_inf, 1);
		for (double i = lim_inf + delta; i < lim_sup; i += delta) {
			aux_soma = normal(i, 1);
			retorno += aux + aux_soma;
			aux = aux_soma;
		}
		retorno *= delta / 2;
		return retorno;
	}

	private double normal(double x, double desvio) {
		double retorno = -0.5 * (x / desvio) * (x / desvio);
		retorno = Math.exp(retorno);
		retorno = retorno / (desvio * Math.sqrt(6.283184));
		return retorno;
	}

	public double calculaAvaliacao() {
		return 0.0;
	}

	public void setDesvio(double desvio) {
		this.desvio = desvio;
	}

	public double getDesvio() {
		return desvio;
	}

}
